package chapter02

object Test04_Function3 {
  def main(args: Array[String]): Unit = {
    //函数可以赋值给变量
    //带参数列表的函数
    def f1(age: Int): String = {
      s"我的年龄${age}"
    }
    //将结果赋值给变量
    val a = f1(20)
    println(a)
    //将函数赋值给变量
    val b = f1 _
    println(b)
    println(b(15))
    //如果不带参数的函数赋值
    def f2 = "你好"
    //函数调用
    val c = f2
    //函数赋值
    val d = f2 _
    //函数的参数可以是函数
    //函数作为参数
    def calc(a:Int,b:Int,f:(Int,Int)=>Int): Int = {
      f(a,b)
    }
    //进行加法计算
    def add(a:Int,b:Int):Int={
      a+b
    }
    println(calc(10,20,add))
    //定义一个减法规则
    def sub(a:Int,b:Int):Int={
      a-b
    }
    println(calc(20,10,sub))
    //使用匿名函数 作为参数传入
    println(calc(20,10,(a:Int,b:Int)=>{a*b}))
    //如果参数类型能够推断 可以省略参数类型
    println(calc(20,10,(a,b)=>{a*b}))
    //如果函数体只有一个语句 可以省略大括号
    println(calc(20,10,(a,b)=>a*b))
    //如果每个参数只是用一次 可以用_代替对应的参数
    println(calc(20,10,_*_))
  }
}
